package com.portalito.android;

import java.io.File;
import java.util.ArrayList;

import com.portalito.android.dto.Coord;
import com.portalito.android.dto.Almacen;
import com.portalito.android.dto.OrdenCompra;
import com.portalito.android.dto.Producto;
import com.portalito.android.dto.Proveedor;
import com.portalito.android.dto.Usuario;
import com.portalito.android.modelo.DAO;
import com.portalito.android.tarea.SincronizadorService;
import com.portalito.android.Utils;

import android.app.Application;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Environment;
import android.util.Log;

public class AplicacionBase extends Application {
	
	public final static double VERSION = 1.0;
	public final static String TAG = "AplicacionBase";
	public final static String AGREGADO_INTENT = "agregadoIntent";
	//public final static String RUTA_SERVICIO = "http://erp.portalito.com/erpmateriales/android_bridge_ordenescompra/";
	public final static String RUTA_SERVICIO = "http://erp.portalito.com/erpmateriales/android_bridge_ordenescompra_jocapra/";
	public final static File RUTA_SDCARD = Environment.getExternalStorageDirectory();
	public static boolean DEBUG_ON = true;
	public static String PREFS_NAME = "com.portalito.preferencias";
	
	//private GPS gps;
	private DAO dao;
	private Coord coord;
	private Usuario usuario;
	private boolean conectado;
	private boolean sincronizadorActivo;
	private String androidId;
	
	@Override
	public void onCreate() {
		super.onCreate();
		dao = new DAO(getApplicationContext());
		conectado = false;
		coord = new Coord();
		//gps = new GPS(this);
		//gps.iniciar();
		
		androidId = Utils.obtenerAndroidId(this);
		
		if(estaSincronizadorActivo() == false) {
			startService(new Intent(this, SincronizadorService.class));
		}
	}
	
	public String getFechaUtilmaSincronizacion() {
		SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
		return settings.getString("fechaSincronizacion", "");
	}
	
	public void setFechaUtilmaSincronizacion(String fecha) {
		SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
		SharedPreferences.Editor editor = settings.edit();
		editor.putString("fechaSincronizacion", fecha);
		editor.commit();
	}
	
	public String getAndroidId() {
		return androidId;
	}
	
	public ArrayList<Proveedor> obtenerProveedores() {
		return dao.obtenerProveedores();
	}
	
	public ArrayList<Almacen> obtenerAlmacenesUsuario() {
		return usuario.getAlmacenes();
	}
	
	public void setUsuarioAlmacen(Almacen almacen) {
		usuario.setAlmacen(almacen);
	}
	
	public Almacen getUsuarioAlmacen() {
		return usuario.getAlmacen();
	}
	
	public String getUsuarioAlmacenId() {
		return usuario.getAlmacenId();
	}
	
	public void setUsuarioProveedor(Proveedor proveedor) {
		usuario.setProveedor(proveedor);
	}
	
	public Proveedor getUsuarioProveedor() {
		return usuario.getProveedor();
	}
	
	public String getUsuarioProveedorNombre() {
		if(usuario != null) {
			return usuario.getProveedorNombre();
		}
		return null;
	}
	
	public String getUsuarioId() {
		if(usuario != null) {
			return usuario.getUsuario();
		}
		return null;
	}
	
	public Usuario getUsuario() {
		return usuario;
	}
	
	public boolean tienePermisoRecibir() {
		if(usuario != null) {
			return usuario.tienePermisoRecibir();
		}
		return false;
	}
	
	public Coord getCoord() {
		return coord;
	}
	
	public String getUsuarioNombre() {
		if(usuario != null) {
			return usuario.getNombre();
		}
		return null;
	}
	
	public String getUsuarioAlmacenNombre() {
		if(usuario != null) {
			return usuario.getAlmacenNombre();
		}
		return null;
	}
	
	public boolean estaConectado() {
		return conectado;
	}
	
	public boolean login(String usuario, String clave) {
		Usuario usuarioDto = dao.obtenerUsuario(usuario, Utils.SHA1(clave));
		if(usuarioDto == null) {
			usuarioDto = dao.obtenerUsuario(usuario, clave);
		}
		if(usuarioDto != null) {
			this.usuario = usuarioDto;
			setUsuarioProveedor(new Proveedor("*"));
			conectado = true;
			setFechaUtilmaSincronizacion("");
			return true;
		}
		return false;
	}
	public void desconectar() {
		conectado = false;
		usuario = null;
	}
	
	public boolean estaSincronizadorActivo() {
		return sincronizadorActivo;
	}

	public void setSincronizadorActivo(boolean sincronizadorActivo) {
		this.sincronizadorActivo = sincronizadorActivo;
	}
	
	public void setGPSCoords(double latitud, double longitud) {
		coord.setLatitud(latitud);
		coord.setLongitud(longitud);
		Log.d(TAG, "Latitud: " + coord.getLatitud()+ " Longitud:" + coord.getLongitud());
	}
	
	// "Interface" to avoid direct coupling with DAO
	public Usuario obtenerUsuario(String id) {
		return dao.obtenerUsuario(id, false);
	}
	
	public boolean guardarAlmacen(Almacen almacen) {
		return dao.guardarAlmacen(almacen);
	}
	
	public Almacen obtenerAlmacen(String id) {
		return dao.obtenerAlmacen(id);
	}
	
	public ArrayList<Almacen> obtenerAlmacenes() {
		return dao.obtenerAlmacenes();
	}
	
	public boolean guardarUsuario(Usuario usuario) {
		return dao.guardarUsuario(usuario);
	}
	
	public ArrayList<OrdenCompra> obtenerOrdenesCompra(int pos, int limite) {
		return dao.obtenerOrdenesCompra(getUsuarioId(), getUsuarioAlmacenId(), getUsuarioProveedorNombre(), pos, limite);
	}
	
	public int obtenerNumeroDeOrdenesCompra() {
		return dao.obtenerNumeroDeOrdenesDeCompra(getUsuarioId(), getUsuarioAlmacenId(), getUsuarioProveedorNombre());
	}
	
	public OrdenCompra obtenerOrdenCompra(int id, boolean cargarProductos) {
		return dao.obtenerOrdenCompra(id, cargarProductos);
	}
	
	public boolean guardarOrdenCompra(OrdenCompra oc) {
		return dao.guardarOrdenCompra(oc);
	}
	
	public boolean actualizarOrdenCompra(OrdenCompra oc) {
		return dao.actualizarOrdenCompra(oc);
	}
	
	public Producto obtenerProducto(String id, int ordenCompra) {
		return dao.obtenerProducto(id, ordenCompra);
	}
	
	public ArrayList<Producto> obtenerProductos(int ordenCompra) {
		return dao.obtenerProductos(ordenCompra);
	}
	
	public boolean guardarProducto(Producto producto) {
		return dao.guardarProducto(producto);
	}
	
	public ArrayList<OrdenCompra> obtenerOrdenesCompraPorEnviar() {
		return dao.obtenerOrdenesCompraPorEnviar(getUsuarioId(), getUsuarioAlmacenId());
	}
	
	public boolean actualizarOrdenCompraEnviada(OrdenCompra oc) {
		return dao.actualizarOrdenCompraEnviada(oc);
	}
	
	public boolean actualizarOrdenCompraEnviadaError(OrdenCompra oc) {
		return dao.actualizarOrdenCompraEnviadaError(oc);
	}
}
